<?php
class ReciboCobranzaDetalle extends AppModel {
    var $name = 'ReciboCobranzaDetalle';
    var $validate = array(
        'codigo_documento_ref_id' => array(
            'rule' => 'numeric',
            'required' => true,
            'allowEmpty' => false,
            'message' => 'Tipo de documento incorrecto'
        ),
        'documento_referencia_id' => array(
            'rule' => 'numeric',
            'required' => true,
            'allowEmpty' => false,
            'message' => 'Documento obligatorio'
        ),        
        'nombre_cliente' => VALID_NOT_EMPTY
    );

    var $belongsTo = array(
          
            'CodigoDocumentoReferencia' => array(
                    'className' => 'CodigoDocumento',
                    'foreignKey' => 'codigo_documento_ref_id'
            ),
            'DocumentoReferencia' => array(
                    'className' => 'DocumentoVenta',
                    'foreignKey' => 'documento_referencia_id',
                    'contain' =>'Familia'
            ),
           
            // 'CuentaCorrienteCobrar' => array(
                    // 'className' => 'CuentaCorrienteCobrar',
                    // 'foreignKey' => 'documento_relacionado_id'
            // ),
            'Familia' => array(
                    'className' => 'Familia',
                    'foreignKey' => 'familia_id'
            ),
            'ReciboCobranza' => array(
                    'className' => 'ReciboCobranza',
                    'foreignKey' => 'recibo_cobranza_id'
            )
    );

    private function verificarFechaTrabajo(){
		$result = true;
		$mensaje= '';
		# FECHA DE TRABAJO DE USUARIO
		$usuarioTrabajo 	= $this->fechaTrabajo();
		$usuarioEjercicio	= $this->ejercicioId($usuarioTrabajo);
		$usuarioPeriodo		= $this->periodoId($usuarioTrabajo);		
		# FECHA DE TRABAJO DEL SISTEMA
		$sistemaTrabajo		= date('d/m/Y');
		$sistemaEjercicio 	= $this->ejercicioId($sistemaTrabajo);
		$sistemaPeriodo		= $this->periodoId($sistemaTrabajo);	
		# solo calculamos el año
		$usuarioAnio	= explode('/',$usuarioTrabajo);
		$sistemaAnio	= explode('/',$sistemaTrabajo);
		
		if($usuarioAnio[2]>$sistemaAnio[2]){
			$mensaje.= 'No puede Trabajar en un Año diferente.<br />';
			$this->Session->setFlash(__($mensaje, true));
			$this->redirect(array('action'=>'index'));
		}			
		return true;
	}
    
    private function verificarRepetidos($documento){
		$result 	= true;
		$documento	= trim($documento);		
		$consultar 	= $this->ReciboCobranza->find('first',array(
								'recursive'=>-1,
								'conditions'=>array(
										'ReciboCobranza.empresa_id'=>$this->empresaId(),
										'ReciboCobranza.centro_dist_id'=>$this->centroDistId(),
										'ReciboCobranza.numero_documento'=>$documento,
										'ReciboCobranza.numero_documento <>\'\' ',
							            'ReciboCobranza.numero_documento IS NOT NULL',
										'ReciboCobranza.activo'=>true)
							));
		if(!empty($consultar)){
			$result = false;	
		}		
		return $result;
	}    
        
    
    function createReciboCobranza($data = array()) { 
         
        $this->verificarFechaTrabajo();
       
        $msj = '';
        if (!empty($data)) {
		
                $data['ReciboCobranza']['empresa_id'] 		= $this->empresaId();
                $data['ReciboCobranza']['centro_dist_id'] 	= $this->centroDistId();
                $data['ReciboCobranza']['ejercicio_id'] 	= $this->ejercicioId($data['ReciboCobranza']['fecha']);
                $data['ReciboCobranza']['periodo_id'] 		= $this->periodoId($data['ReciboCobranza']['fecha']);
                $data['ReciboCobranza']['activo'] 		= true;
                $data['ReciboCobranza']['anulado'] 		= false;
                $data['ReciboCobranza']['usuario_creacion_id']  = $this->usuarioId();
                $data['ReciboCobranza']['fecha_creacion'] 	= 'now()';
                $data['ReciboCobranza']['percepcion_id'] 	= 0;
                $data['ReciboCobranza']['monto_recibido']	= $this->ReciboCobranza->getMontoRecibido($data);  
				       
                # BUSCAMOS SI HAY DOCUMENTOS REPETIDOS
		
                $follow 	= true;
                $repetidos 	= array();
                $mensaje	= '';
                if(count($data['ReciboCobranzaDetalle'])>0){
                        foreach($data['ReciboCobranzaDetalle'] as $reciboDetalle){
                                if(!empty($reciboDetalle['documento_referencia_id']) && !empty($reciboDetalle['numero_documento_referencia']) && !empty($reciboDetalle['codigo_documento_ref_id'])){							
                                        $repetidos[] = $reciboDetalle['documento_referencia_id'];								
                                }
                        }
                        asort($repetidos);		
                        $codigoRepetido = '';					
                        foreach($repetidos as $rep=>$cod){
                                if($codigoRepetido==$cod){
                                        $this->Session->setFlash('Error: Documento Repetidos en el recibo de cobranza.');
                                        $follow = false;	
                                        break;
                                }
                                $codigoRepetido=$cod;
                        }	 
                } 
                if($follow){           
                $numDoc 	= $data['ReciboCobranza']['numero_documento'];
                $vendedore	= $data['ReciboCobranza']['vendedor_id'];
				$flag = 0;
                $long = strlen(trim($numDoc));
                if ($long > 0 && $long < 3){
                    $msj .= 'Error: El numero del documento es incorrecto. <br />';
                    $follow = false;
                } else if ($long > 0) {                	
                	$follow = true;
                }
                $numeroRecibo = trim($data['ReciboCobranza']['numero_documento']);
                if(!empty($numeroRecibo)){
                        # validamos si ya existe el documento
                        $follow	 = $follow && $this->verificarRepetidos($numeroRecibo);
                        if(!$follow){
                                $msj .= 'Error: El numero '.$numeroRecibo.' ya existe.'.$mensaje.' <br />';
                                $follow = false;	
                        }					
                }
                $this->ReciboCobranza->create(); 
                if ($follow && $this->ReciboCobranza->save($data)) {
                    $reciboId = $this->ReciboCobranza->id;
                    $data['ReciboCobranza']['monto_percepcion']	= 0;
                    foreach($data['ReciboCobranzaDetalle'] as $detalle){
                        if (empty($detalle['codigo_documento_ref_id'])||
                                empty($detalle['documento_referencia_id']))
                            continue;
                        
                        // cuenta corriente cabecera
                        $contado = $detalle['contado'] = $detalle['contado']=='true'?true:false;
                        $cancela = false;
                        $detalle['abono_percepcion'] = 0;

                        if ($follow && !$detalle['contado']){
                            if ($detalle['codigo_documento_ref_id'] != 125){ // comprobando importes
                                $referencia = $this->ReciboCobranza->DocumentoReferencia->find('first',array(
                                    'conditions'=>array('DocumentoReferencia.id'=>$detalle['documento_referencia_id']),
                                    'recursive'=>-1
                                )); // para validar el monto total del documento referencia                                
                                $referencia['DocumentoReferencia']['suma_percepcion'] = empty($referencia['DocumentoReferencia']['suma_percepcion'])?0:$referencia['DocumentoReferencia']['suma_percepcion'];
                                $referencia['DocumentoReferencia']['suma_importe_total'] = empty($referencia['DocumentoReferencia']['suma_importe_total'])?0:$referencia['DocumentoReferencia']['suma_importe_total'];
                                $referencia['DocumentoReferencia']['cargo'] = empty($referencia['DocumentoReferencia']['cargo'])?0:$referencia['DocumentoReferencia']['cargo'];
                                $referencia['DocumentoReferencia']['abono'] = empty($referencia['DocumentoReferencia']['abono'])?0:$referencia['DocumentoReferencia']['abono'];                                
                                $referencia['DocumentoReferencia']['cargo_percepcion'] = empty($referencia['DocumentoReferencia']['cargo_percepcion'])?0:$referencia['DocumentoReferencia']['cargo_percepcion'];
                                $referencia['DocumentoReferencia']['abono_percepcion'] = empty($referencia['DocumentoReferencia']['abono_percepcion'])?0:$referencia['DocumentoReferencia']['abono_percepcion'];

                                // saldo de cta corriente
                                $cargo = number_format($referencia['DocumentoReferencia']['cargo'], 2, '.', '');
								$totalAbono = $referencia['DocumentoReferencia']['abono'] + $detalle['abono'];
                                $abono = number_format($totalAbono, 2, '.', '');
                                $referencia['DocumentoReferencia']['abono'] = $abono;
                                
                                if ($cargo < $abono && $_SESSION['Usuario']['CentroDist']['id'] != 58){ # VERIFICAMNOS QUE SEA DIFERENTE DEL CD VIP HOTEL
                                    $msj .= 'Error: El importe abonado supera el cargo actual del documento referencia.'.' <br />';
                                    $follow = false;
                                    break;
                                }

                                // percepcion
                                if ($referencia['DocumentoReferencia']['suma_percepcion'] > 0){
                                    if ($cargo == $abono)
                                        $detalle['abono_percepcion'] = number_format($referencia['DocumentoReferencia']['cargo_percepcion'] - $referencia['DocumentoReferencia']['abono_percepcion'],2,'.','');
                                    else
                                        $detalle['abono_percepcion'] = number_format($detalle['abono'] * $referencia['DocumentoReferencia']['ref_percepcion_total'] / 100, 2, '.', '');

                                    $cargoPerc = number_format($referencia['DocumentoReferencia']['cargo_percepcion'],2,'.','');
                                    $abonoPerc = number_format($referencia['DocumentoReferencia']['abono_percepcion'] + $detalle['abono_percepcion'], 2, '.', '');
                                    $referencia['DocumentoReferencia']['abono_percepcion'] = $abonoPerc;

                                    if ($cargoPerc < $abonoPerc){
                                        $msj .= 'Error: La percepcion abonada supera el cargo del documento referencia.'.$cargoPerc.'/'.$abonoPerc.' <br />';
                                        $follow = false;
                                        break;
                                    } 
                                }
                                unset($referencia['DocumentoReferencia']['suma_percepcion']);
                                unset($referencia['DocumentoReferencia']['cargo']);
                                unset($referencia['DocumentoReferencia']['cargo_percepcion']);

                                $cancela = $cargo == $abono;
                                if($cargo == $abono){
                                    $referencia['DocumentoReferencia']['fecha_cancelacion']  = $data['ReciboCobranza']['fecha'];
								}else{
                                    $referencia['DocumentoReferencia']['fecha_cancelacion']  = null;
								}
                                if ($follow && !$this->ReciboCobranza->DocumentoReferencia->save($referencia)){
                                    $msj .= 'Error: No se ha podido actualizar el saldo de cargo y abono del documento referencia. <br />';
                                    $follow = false;
                                    break;
                                }
                                
                            } else {
                               
                            }
                        }
                        $data['ReciboCobranza']['monto_percepcion'] += $detalle['abono_percepcion'];
                        $detalle['cancela'] = $cancela;

                        $detalle['recibo_cobranza_id'] = $reciboId;
						
                        $totalDiferenciaCambio 	= 0;
                        $cargoDiferenciaCambio 	= 0;
                        $abonoDiferenciaCambio 	= 0;
                        $tipoCambioNuevo	= $data['ReciboCobranza']['tipo_cambio'];
                        $tipoCambioUltimo	= $data['ReciboCobranza']['tipo_cambio_copy'];
                        $diferencia		= true;
                        if(($tipoCambioNuevo <> $tipoCambioUltimo) && ($data['ReciboCobranza']['moneda_id']<>1)){
                                $cargoDiferenciaCambio = round($detalle['abono'] * $tipoCambioUltimo,2);
                                $abonoDiferenciaCambio = round($detalle['abono'] * $tipoCambioNuevo,2);
                                $totalDiferenciaCambio = $cargoDiferenciaCambio - $abonoDiferenciaCambio;
                                $diferencia = false;							
                        }
                        $this->ReciboCobranza->ReciboCobranzaDetalle->create();
                        if ($this->ReciboCobranza->ReciboCobranzaDetalle->save($detalle)){                            
                            //empezamo a grabar en Cuen.Corr.Cob
                            //verificamos si es CARGO=0 y ABONO!=0
                            if ($follow && !$detalle['contado']){ 
                                $this->bindModel(
                                                array(
                                                        'belongsTo'=>array(
                                                                'CuentaCorrienteCobrar'=>array('className'=>'CuentaCorrienteCobrar')
                                                )));
                                $follow = $this->CuentaCorrienteCobrar->saveCc(
                                                                                $data['ReciboCobranza']['empresa_id'],
                                                                                $data['ReciboCobranza']['centro_dist_id'],
                                                                                $data['ReciboCobranza']['ejercicio_id'],
                                                                                $data['ReciboCobranza']['periodo_id'],
                                                                                $data['ReciboCobranza']['fecha'],
                                                                                $detalle['codigo_documento_ref_id'],
                                                                                $detalle['documento_referencia_id'],
                                                                                number_format($detalle['abono'],2,'.',''),
                                                                                $detalle['abono_percepcion'],
                                                                                false,
                                                                                111,
                                                                                $detalle['recibo_cobranza_id'],
										$data['ReciboCobranza']['numero_documento'],
										$data['ReciboCobranza']['tipo_cambio'],
										$totalDiferenciaCambio
										);
                            }
                        } else {
                            $follow = false;
                            break;
                        }
                    }

                    if ($this->data['ReciboCobranza']['monto_percepcion'] > 0)
                        $this->ReciboCobranza->save($this->data);
										
                    if (!$follow){
//                        $this->Session->setFlash('Se ha producido un error al guardar el Recibo de Cobranza.');
                        return 0;
                    } 
                } else {                    
                    if ($follow) $msj .= 'Error guardando los datos del recibo de cobranza.';
                    return 0;
                }
            }else{
                    return 0;
            }
        } 
        
        return $this->ReciboCobranza->id;
    } 
}
?>